import 'package:flutter_test/flutter_test.dart';
import 'package:google_mlkit_barcode_scanning/google_mlkit_barcode_scanning.dart';

void main() {
  group('BarcodeScanner构造函数测试', () {
    test('默认构造函数应该正确创建', () {
      final scanner = BarcodeScanner();
      expect(scanner, isNotNull);
    });

    test('自定义格式构造函数应该正确创建', () {
      final formats = [BarcodeFormat.qrCode, BarcodeFormat.code128];
      final scanner = BarcodeScanner(formats: formats);
      expect(scanner, isNotNull);
    });
  });

  group('BarcodeFormat扩展方法测试', () {
    test('rawValue应该返回正确的整数值', () {
      expect(BarcodeFormat.all.rawValue, 0xFFFF);
      expect(BarcodeFormat.qrCode.rawValue, 0x0100);
      expect(BarcodeFormat.code128.rawValue, 0x0001);
    });

    test('fromRawValue应该返回正确的BarcodeFormat枚举值', () {
      expect(BarcodeFormatValue.fromRawValue(0xFFFF), BarcodeFormat.all);
      expect(BarcodeFormatValue.fromRawValue(0x0100), BarcodeFormat.qrCode);
      expect(BarcodeFormatValue.fromRawValue(0x0001), BarcodeFormat.code128);
    });

    test('fromRawValue对于未知值应该返回BarcodeFormat.unknown', () {
      expect(BarcodeFormatValue.fromRawValue(9999), BarcodeFormat.unknown);
    });
  });

  group('Barcode.fromJson测试', () {
    test('应该正确解析有效的JSON数据', () {
      final json = {
        'type': 8, // text type
        'format': 0x0100, // qrCode format
        'displayValue': 'Test QR Code',
        'rawValue': 'Test QR Code',
        'rect': {'left': 10, 'top': 10, 'right': 100, 'bottom': 100},
        'points': [
          {'x': 10, 'y': 10},
          {'x': 100, 'y': 10},
          {'x': 100, 'y': 100},
          {'x': 10, 'y': 100}
        ]
      };

      final barcode = Barcode.fromJson(json);

      expect(barcode, isNotNull);
      expect(barcode.format, BarcodeFormat.qrCode);
      expect(barcode.displayValue, 'Test QR Code');
      expect(barcode.rawValue, 'Test QR Code');
      expect(barcode.boundingBox.left, 10);
      expect(barcode.cornerPoints.length, 4);
    });

    test('应该处理无效的JSON数据', () {
      final invalidJson = {'invalid_field': 'value'};

      final barcode = Barcode.fromJson(invalidJson);

      // 应该返回默认的Barcode对象而不崩溃
      expect(barcode, isNotNull);
    });

    test('应该处理null值的情况', () {
      final jsonWithNulls = {
        'type': null,
        'format': null,
        'displayValue': null,
        'rawValue': null,
        'rect': null,
        'points': null
      };

      final barcode = Barcode.fromJson(jsonWithNulls);

      // 应该能够处理null值而不崩溃
      expect(barcode, isNotNull);
      expect(barcode.boundingBox, isNotNull);
    });
  });

  group('条码数据解析测试', () {
    test('应该正确解析包含WiFi信息的条码数据', () {
      final json = {
        'type': 11, // wifi type
        'format': 0x0100, // qrCode format
        'ssid': 'TestWifi',
        'password': 'TestPassword',
        'encryption': 2,
        'rect': {'left': 10, 'top': 10, 'right': 100, 'bottom': 100},
        'points': [
          {'x': 10, 'y': 10},
          {'x': 100, 'y': 10},
          {'x': 100, 'y': 100},
          {'x': 10, 'y': 100}
        ]
      };

      final barcode = Barcode.fromJson(json);

      // 检查是否正确创建了条码对象
      expect(barcode, isNotNull);
      // 检查基本字段是否正确解析
      expect(barcode.format, BarcodeFormat.qrCode);
    });

    test('应该正确解析包含URL信息的条码数据', () {
      final json = {
        'type': 9, // url type
        'format': 0x0100, // qrCode format
        'title': 'Test Title',
        'url': 'https://example.com',
        'rect': {'left': 10, 'top': 10, 'right': 100, 'bottom': 100},
        'points': [
          {'x': 10, 'y': 10},
          {'x': 100, 'y': 10},
          {'x': 100, 'y': 100},
          {'x': 10, 'y': 100}
        ]
      };

      final barcode = Barcode.fromJson(json);

      // 检查是否正确创建了条码对象
      expect(barcode, isNotNull);
      // 检查基本字段是否正确解析
      expect(barcode.format, BarcodeFormat.qrCode);
    });
  });

  group('错误处理测试', () {
    test('BarcodeEmail.fromJson应该处理无效的emailType', () {
      final json = {
        'emailType': 999, // 无效的email类型
        'address': 'test@example.com',
        'body': 'Test body',
        'subject': 'Test subject'
      };

      // 应该抛出异常
      expect(() => BarcodeEmail.fromJson(json), throwsRangeError);
    });

    test('BarcodePhone.fromJson应该处理无效的phoneType', () {
      final json = {
        'phoneType': 999, // 无效的phone类型
        'number': '1234567890'
      };

      // 应该抛出异常
      expect(() => BarcodePhone.fromJson(json), throwsRangeError);
    });
  });
}